/*
 * Copyright 2025 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.cloud.ai.manus.tool.api;

import com.alibaba.cloud.ai.manus.tool.AbstractBaseTool;
import com.alibaba.cloud.ai.manus.tool.code.ToolExecuteResult;
import com.alibaba.cloud.ai.manus.tool.searchAPI.serpapi.SerpApiService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.openai.api.OpenAiApi;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class HkProductApi extends AbstractBaseTool<HkProductApi.HkProductInput> {

    private static final Logger log = LoggerFactory.getLogger(HkProductApi.class);
    
    private static String PARAMETERS = """
            {
                "type": "object",
                "properties": {
                    "query": {
                        "type": "string",
                        "description": "(required) 描述产品类型，多个产品类型可拼接."
                    }
                },
                "required": ["query"]
            }
            """;

    private static final String name = "hk_product_api";

    private static final String description = """
            根据指定的产品类型获取产品信息.目前有公募、私募、现金宝、定存、海外保险产品类型.
            """;

    public static OpenAiApi.FunctionTool getToolDefinition() {
        OpenAiApi.FunctionTool.Function function = new OpenAiApi.FunctionTool.Function(description, name, PARAMETERS);
        OpenAiApi.FunctionTool functionTool = new OpenAiApi.FunctionTool(function);
        return functionTool;
    }
    

    @Override
    public String getName() {
        return name;
    }

    @Override
    public String getDescription() {
        return description;
    }

    @Override
    public String getParameters() {
        return PARAMETERS;
    }

    @Override
    public Class<HkProductInput> getInputType() {
        return HkProductInput.class;
    }

    @Override
    public ToolExecuteResult run(HkProductInput input) {
        String query = input.getQuery();
        log.info("HkProductApi query:{}", query);
        try {

            return new ToolExecuteResult("公募推荐产品：\n" +
                    "高股息/派息主题\n" +
                    "安本基金 - 环球动力股息基金A类派息 (美元)（LU2237443382_USAL）：股票基金，年化派息收益率约6%，投资美欧亚大市值股票，行业配置均衡。标签包括：高股息,美元计价,全球配置。\n" +
                    "贝莱德全球基金 - 系统分析环球股票高息基金 (美元) A6 每月派息（LU1116320737）：股票基金，年化派息收益率约7%，投资美欧亚大市值股票，行业配置均衡。标签包括：高息基金,美元派息,全球布局。\n" +
                    "JPM环球股息A类派息（美元）（LU0329202179）：股票基金，投资美欧亚大市值股票，行业配置均衡。标签包括：环球股息,美元派息,行业均衡。\n" +
                    "美国主题\n" +
                    "联博-精选美国股票基金 A（LU0683600562）：股票基金，以标普500为参照，信息、金融等行业配置均衡，重仓微软等股。标签包括：美国股票,行业均衡,重仓科技。\n" +
                    "贝莱德全球基金 - 世界科技基金 (美元) A2（LU0056508442）：股票基金，全球科技布局，美股占比75%，M7巨头持仓集中。标签包括：世界科技,美元基金,美股为主。\n" +
                    "安联环球人工智能股票基金 (美元) AT 类累积股份（LU1548497426_USAL）：股票基金，全球科技，美股占超80%，半导体巨头持仓高。标签包括：人工智能,美元股票,美股重仓。\n" +
                    "JPM 美国科技基金A类派息份额(美元)（LU0082616367）：股票基金，配置美国M7科技巨头等公司。标签包括：美国科技,美元派息,巨头持仓。\n" +
                    "中国主题\n" +
                    "华夏中国机会基金 A USD（LU0531876844_USAL）：股票基金，组合中港股80%，A股和美国中概各5%左右。标签包括：中国机会,美元基金,港股为主。\n" +
                    "安本基金 - 全方位中国可持续股票基金 A Acc USD（LU0231483743_USAL）：股票基金，港股50%、A股30%、美中概10%，配置均衡。标签包括：中国主题,美元股票,配置均衡。\n" +
                    "安联中国股票基金 (美元) A（LU0348825331_USAL）：股票基金，组合中港股84%，A股9%，美国中概6%。标签包括：中国股票,美元计价,港股重仓。\n" +
                    "JPM大中华股票A类派息(美元)（LU0117841782）：股票基金，港股+A股超60%，台湾地区股票30%。标签包括：大中华股,美元派息,两岸配置。\n" +
                    "日本主题\n" +
                    "瀚亚投资 - 日本动力股票基金A类累积份额(美元)（LU0560541111_USAL）：股票基金，投资大市值日本股票，行业配置均衡，重仓多公司。标签包括：日本动力,美元股票,大市值股。\n" +
                    "安本基金 - 日本小型公司可持续股票基金 A Acc Hedged USD（LU0941570995_USAL）：股票基金，投资中小市值日本股票，挖掘“隐形冠军”，持仓分散。标签包括：日本小企,美元股票,隐形冠军。\n" +
                    "贝莱德全球基金 - 日本中小型企业特别时机基金 A2（LU0006061252）：股票基金，投资中小市值日本股票，挖掘细分冠军，持仓分散。标签包括：日中小企业,美元基金,持仓分散。\n" +
                    "摩根日本（日圆）基金累积(美元对冲)（HK0000155504）：股票基金，投资大市值日本股票，侧重信息技术等行业。标签包括：摩根日本,美元对冲,大股投资。\n" +
                    "欧洲主题\n" +
                    "霸菱德国增长基金A类累积(美元)（GB00BF2H6K58_USAL）：股票基金，主要投资德国股市，工业等行业占比高，重仓多股。标签包括：德国增长,美元股票,行业重仓。\n" +
                    "贝莱德全球基金 - 欧洲价值型基金 A2（LU0171281750）：股票基金，欧元区55%、英国30%等，配置均衡，重仓多股。标签包括：欧洲价值,美元基金,均衡配置。\n" +
                    "联博-欧元区股票基金 A USD（LU0528102998）：股票基金，欧元区占80%+，英国8%，重仓多股。标签包括：欧元区股,美元股票,重仓欧洲。\n" +
                    "贵金属主题\n" +
                    "贝莱德全球基金 - 世界黄金基金 A2 (美元)（LU0055631609）：股票基金，投资全球黄金矿产商股票，加拿大占58%等。标签包括：世界黄金,美元基金,矿产投资。\n" +
                    "木星黄金白银基金 A USD Acc（IE00BYVJR809_USAL）：股票基金，80%投资金银矿产商，17%投实物。标签包括：金银双驱,美元股票,实物投资。\n" +
                    "固收主题\n" +
                    "高腾亚洲收益债券基金A类累积份额(美元)（HK0000447943_USGT）：债券基金，久期4.2年，60%投资级债券，主要投亚太。标签包括：亚洲收益,美元债基,投资亚太。\n" +
                    "华夏精选亚洲债券基金 Class A Dist USD（HK0000301942_USAL）：债券基金，久期4.4年，超90%投资级债券，投亚太。标签包括：精选亚债,美元债基,高投级债。\n" +
                    "PIMCO 新兴市场本土债券基金E类派息份额(美元)（IE00B3K58T01）：债券基金，久期6.4年，60%投资级债券，配置新兴市场。标签包括：新兴债基,美元派息,配置新兴。\n" +
                    "固收+主题\n" +
                    "PIMCO GIS -收益增长基金E类累积份额(美元)（IE00B4YYXB79）：混合基金，经典股60%+债40%组合，股票40%为美股。标签包括：收益增长,美元混基,股债组合。\n" +
                    "联博跨领域收益基金AD类派息份额(美元)（LU1127387386）：混合基金，股、投级债、高收益债各占约1/3，投美欧市场。标签包括：跨域收益,美元混基,美欧投资。\n" +
                    "联博新兴市场股债基金A类累积份额(美元)（LU0633140560）：混合基金，股65%+债35%，投资全球新兴市场。标签包括：新兴股债,美元混基,新兴投资。\n" +
                    "安联收益及增长基金 (美元) AM 月类收息股份（LU0820561818_USAL）：混合基金，年化派息超8%，股30%、可转债30%、高收益债30%。标签包括：收益增长,美元混基,高派息率。\n" +
                    "互认基金主题（香港注册、内地互认的公募基金，待讨论）\n" +
                    "摩根太平洋科技（美元）（累计）（HK0000055761）：股票基金，投资亚太科技巨头，中国内地和香港34%等。标签包括：互认基金,美元股票,亚太科技。");
        } catch (Exception e) {
            log.error("Error executing HkProductApi search", e);
            return new ToolExecuteResult("Error executing HkProductApi search: " + e.getMessage());
        }
    }

    @Override
    public String getCurrentToolStateString() {
        return String.format("""
				获取产品信息: %s
				""", "成功");
    }

    @Override
    public void cleanup(String planId) {
        // do nothing
    }

    @Override
    public String getServiceGroup() {
        return "default-service-group";
    }

    /**
     * Internal input class for defining input parameters of Google search tool
     */
    public static class HkProductInput {

        private String query;

        public HkProductInput(String query) {
            this.query = query;
        }

        public String getQuery() {
            return query;
        }

        public void setQuery(String query) {
            this.query = query;
        }

    }

}
